考点:php反序列化字符长度逃逸
分析
1 |
|
查看php信息
发现了特殊文件名d0g3_f1ag.php
1 | $_SESSION["user"] = 'guest'; |
可控参数为user
和 function
,序列化后会将 flag
过滤为 空字符串,
1 | $_SESSION["user"] = 'flagflagflagflagflagflag'; |
序列化后
1 | a:3:{s:4:"user";s:24:"flagflagflagflagflagflag";s:8:"function";s:59:"a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:2:"dd";s:1:"a";}";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";} |
这里会将flag字符串过滤,过滤后结果
1 | a:3:{s:4:"user";s:24:"#";s:8:"function";s:59:"a#";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:2:"dd";s:1:"a";}";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";} |
由于s:24 会往后边读取24位字符";s:8:"function";s:59:"a
做为user的属性值, #号包含起来的部分,读取到a的时候结束,后面的;进行了闭合,相当于吞掉了一个属性和值,接着会继续读取我们构造的img,由于总共三个属性,我在后边加上了一个属性和值,后边的序列化结果直接就被丢弃。
提交
1 | GET: |
得到
1 |
|
/d0g3_fllllllag
base64编码 L2QwZzNfZmxsbGxsbGFn
提交
1 | GET: |
得到flag
又是一道反序列字符绕过闭合
与上一题不一样的是,上一题是增加字符,这道题是删除字符。
where-> hacker
flag -> ‘’
同样的原理是,将字符数组序列化后,得到一个固定格式的序列化字符串,但是这个序列化字符串被放入某个函数中进行过滤,过滤后,即原本的固定格式没有变,但是里面某些字符被函数中的规则过滤,有可能是增加,有可能会减少,不管怎么样,只要能控制即将被序列化的变量,那么就有可能自己来构建序列化字符串。
payload
1 |
|